package com.pearl.shardingsphere.rw.algorithm;

import org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;

import java.util.List;
import java.util.Properties;

/**
 * 垂直分库：不参与，分好库，一个服务对应一个库，涉及多数据源
 * 垂直分表：不参与，设计库时处理
 * 水平分库： 两个订单库，订单表
 * 水平分表：
 *   单个库中分表：部署一个数据库，分表
 *   多个库中分表：水平分库，然后分表
 *   多个库多个表：
 * @author TD
 * @version 1.0
 * @date 2024/1/30
 */
public final class CustomReadQueryLoadBalanceAlgorithm implements ReadQueryLoadBalanceAlgorithm {

    /**
     * 配置类中的props属性
     *     # 负载均衡算法
     *     loadBalancers:
     *       read:  # 自定义的算法名称
     *         type: CUSTOM # 负载均衡算法类型
     *         # 属性
     *         props:
     *           # 属性名使用读库名称，参数填写读库对应的权重值。权重参数范围最小值 > 0，合计 <= Double.MAX_VALUE。
     *           # 读库名称: 权重
     *           read_ds_0: 9
     *           read_ds_1: 1
     */
    private Properties props;

    // 将配置类props属性赋值给当前对象
    public void init(Properties props) {
        this.props = props;
    }

    public String getDataSource(String name, String writeDataSourceName, List<String> readDataSourceNames) {
        // 自定义处理逻辑（这里演示，直接返回第一个）
        return readDataSourceNames.get(0);
    }

    /**
     * 声明算法类型
     */
    public String getType() {
        return "CUSTOM";
    }

    /**
     * 是否是默认
     */
    public boolean isDefault() {
        return false;
    }

    public Properties getProps() {
        return props;
    }

    public void setProps(Properties props) {
        this.props = props;
    }
}
